#include <iostream>
#include <thread>
#include <mutex>

/**
 * 一、线程运行于结束
 * 程序运行，生成一个进程，该进程所属线程自动执行
 * 
 * 切记多线程多条通路执行
 * 1、thread 类 thread 接受可调用对象
 * 
 * 2、join    ****
 *     会合。说白了就是阻塞，阻塞主线程，让主线程等待子线程执行完毕，然后子线程和主线程汇合
 * 通常如果主线程执行完，子线程没执行完毕吗，程序这就是严重错误的
 * 一个书写良好的程序应该是主线程等待子线程结束之后，自己才最终退出。
 * 
 * 
 * 3、detach  *****
 *      主线程子线程分离  主线程可以先退出，调用detach之后，系统会自动回收未退出的子线程
 *      为什么引入detach:
 *          我们创建很多子线程，让主线程逐个等待子线程结束，这种方法不好
 * //一旦detach 与主线程关联的thread对象就会失去与主线程的关联，由运行时库进行回收
 * 
 * 4.joinable()判断是否可以成功使用join或者detach  返回true表示可以使用join或者detach
 * 
 * 
 * 
 * 
 * 
 * 
 * 
*/



//初始函数
void func(){

    std::cout<<"thread func"<<std::endl;
    std::cout<<"thread id"<<std::this_thread::get_id()<<std::endl;
    std::cout<<"son thread exit"<<std::endl;
}



int main(){

    std::thread t1(func);

    if(t1.joinable()){

        std::cout<<"true"<<std::endl;

    }
    //线程回收
    t1.join();
    //detach会导致线程失去控制，一旦调用detach线程会跑到后台执行
    //t1.detach();
    if(t1.joinable()){
        std::cout<<"t1.joinable truw"<<std::endl;

    }else{
        
        std::cout<<"false"<<std::endl;
        }



    std::cout<<"main thread exit"<<std::endl;

    return 0;

}
